{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "b'\\x00\\x00\\x00\\x02'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import struct\n",
    "struct.pack('>i',2)#高位字节"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2051, 60000, 28, 28)\n",
      "47040000\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "IOPub data rate exceeded.\n",
      "The notebook server will temporarily stop sending output\n",
      "to the client in order to avoid crashing it.\n",
      "To change this limit, set the config variable\n",
      "`--NotebookApp.iopub_data_rate_limit`.\n",
      "\n",
      "Current values:\n",
      "NotebookApp.iopub_data_rate_limit=1000000.0 (bytes/sec)\n",
      "NotebookApp.rate_limit_window=3.0 (secs)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import struct\n",
    "with open('./MNIST_data/train-images-idx3-ubyte','rb')as f:\n",
    "    buffer=f.read(4*4)\n",
    "    head=struct.unpack('>iiii',buffer)\n",
    "    print(head)\n",
    "    length=head[1]*head[2]*head[3]\n",
    "    print(length)\n",
    "    buffer=f.read(length)\n",
    "    print(buffer)\n",
    "    data=struct.unpack('>{}B'.format(length),buffer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "47040000"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "imgs=np.reshape(data,(head[1],head[2],head[3]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "imgs.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "for i in range(5):\n",
    "    plt.imshow(imgs[i], cmap = 'gray')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sort_by_target(mnist):\n",
    "    reorder_train = np.array(sorted([(target,i) for i,target in enumerate(mnist.target[:60000])]))[:,1]  #训练集 \n",
    "    reorder_test = np.array(sorted([(target, i) for i, target in enumerate(mnist.target[60000:])]))[:,1]  #测试集\n",
    "    mnist.data[:60000] = mnist.data[reorder_train]\n",
    "    mnist.target[:60000] = mnist.target[reorder_train]\n",
    "    mnist.data[60000:] = mnist.data[reorder_test + 60000]\n",
    "    mnist.target[60000:] = mnist.target[reorder_test + 60000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import fetch_openml #视频中的fetch_mldata一直报错，一直显示找不到该函数，把mldata放到根目录也不行，使用fetch_openml代替\n",
    "mnist = fetch_openml('mnist_784', version=1, cache=True)\n",
    "mnist.target = mnist.target.astype(np.int8)\n",
    "sort_by_target(mnist)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = mnist['data']\n",
    "y = mnist['target']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000,)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "some_digit = X[36000]\n",
    "some_digit_image = some_digit.reshape(28,28)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(some_digit_image, cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[36000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "建立测试集和训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# split training and test set\n",
    "X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将数据集合交叉洗牌，交叉验证时，每个子集合数据分布均匀，有些机器学习算法对训练实例的顺序敏感\n",
    "import numpy as np\n",
    "shuffle_index = np.random.permutation(60000)\n",
    "X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练一个二元分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_5 = (y_train == 5) # 修改便签为是否等于5\n",
    "y_test_5 = (y_test == 5)\n",
    "\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "sgd_clf = SGDClassifier(max_iter=5, tol=-np.infty, random_state=42)\n",
    "sgd_clf.fit(X_train, y_train_5)\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 性能考核\n",
    "## 使用交叉验证测量精度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.9639 , 0.97015, 0.96505])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring='accuracy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.base import BaseEstimator\n",
    "class Never5Classifier(BaseEstimator):\n",
    "    def fit(self, X, y=None):\n",
    "        pass\n",
    "    def predict(self, X):\n",
    "        return np.zeros((len(X), 1), dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False],\n",
       "       [False],\n",
       "       [False],\n",
       "       ...,\n",
       "       [False],\n",
       "       [False],\n",
       "       [False]])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros((len(X), 1), dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.9126 , 0.9088 , 0.90755])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "never_5_clf = Never5Classifier()\n",
    "cross_val_score(never_5_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")\n",
    "# 准确率超过90% ，因为5的图像大约只有10%，你猜一张图不是5， 90%的时间你都是正确的\n",
    "# 这说明准确率无法成为分类器的首要性能指标，特别是当你处理偏科数据集， 某些类比其他类更为频繁"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "#%%\n",
    "# 评估分类器性能的更好方法是混淆矩阵\n",
    "# A类别实例被分为B类别次数\n",
    "# 想要知道分类器将数字3和数字5混淆多少次，通过混淆矩阵的5行3列\n",
    "from sklearn.model_selection import cross_val_predict\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 与 cross_val_score 相比\n",
    "* 同样执行交叉验证\n",
    "* 返回的不是评估分数，是每个折叠的预测\n",
    "* 每一个实例在模型预测时使用的数据，在训练期间从未见过"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[53680,   899],\n",
       "       [ 1119,  4302]], dtype=int64)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "confusion_matrix(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 行表示实际类别，列表示预测类别\n",
    "# 第一行 第一列 53577 被正确的分为 非5 ，真负类\n",
    "# 第一行 第二列 1002 被错误的分类成 5 ，假正类\n",
    "# 第二行 第一列 1240 张被错误的分为 非5， 假负类\n",
    "# 第二行 第二列 4181 张被正确的分在了5 ，真正类\n",
    "# 这种衡量方式太复杂，我们可以用更简单的指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54579,     0],\n",
       "       [    0,  5421]], dtype=int64)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_perfect_predictions = y_train_5\n",
    "confusion_matrix(y_train_5, y_train_perfect_predictions)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 正类预测的准确率 被称为分类器的精度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8271486252643723"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 精度和召回率\n",
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "precision_score(y_train_5, y_train_pred) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7935805201992252"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 说明 检测一张图的时候，只有90%的概率是准确的，而且只有64%的数字5 被它检测出来\n",
    "# 精度和召回率合成单一指标，成为 F1 分数，谐波平均值\n",
    "# 平均值平等对待所有的值，谐波平均值会给予较低值更高的权重，只有召回率和精度都很高时，才能获得较高的F1分数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8100169459612125"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score\n",
    "f1_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 精度/召回率权衡"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* SGDClassifier对每个实例基于决策函数计算一个分值，大于阀值为正类，否则为负类\n",
    "* 中间阀值右侧找到4个真正类 真5 ， 一个假正类 6， 精度为 4/5 80%\n",
    "* 在所有的6个 真正的5 中，分类器找到了4个，召回率为 4/6 67%\n",
    "* 提高阀值，向右移动，精度提高，召回降低\n",
    "* 反之阀值降低，召回提高，精度降低\n",
    "* SKlearn不可以直接设置阀值，可以访问决策分数，\n",
    "* SGDClassifier 默认阀值为0 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\tangyiru\\appdata\\local\\programs\\python\\python38\\lib\\site-packages\\sklearn\\linear_model\\_logistic.py:938: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  n_iter_i = _check_optimize_result(\n"
     ]
    }
   ],
   "source": [
    "# 如何设置阀值\n",
    "\n",
    "# 用predict_proba得到每个实例属于正类的概率，然后对概率切一下。以LogisticRegression为例\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "clf = LogisticRegression()\n",
    "clf.fit(X_train, y_train)\n",
    "pred_proba = clf.predict_proba(X_test)[:, 1]\n",
    "threshold = 0.75  # 阀值设置为0.75\n",
    "pred_label = pred_proba > threshold\n",
    "\n",
    "# pred_proba是每个实例为真的概率\n",
    "# 假设阈值是0.75\n",
    "# pred_label里True就是概率大于0.75的\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-49977.90911584])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 返回决策值decision_function\n",
    "y_scores = sgd_clf.decision_function([some_digit])\n",
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "threshold = 0\n",
    "y_some_digit_pred = (y_scores > threshold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "threshold = 200000\n",
    "y_some_digit_pred = (y_scores > threshold)\n",
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 如何决定使用什么阀值\n",
    "# 返回决策值，而不是预测结果\n",
    "y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3,\n",
    "                             method=\"decision_function\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000,)"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "\n",
    "precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeMAAAEPCAYAAABx8azBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdd3gUVdvH8e9J7yEkdAIJvUkNVZooRToWpCMqiAoiIu9jFxHbI4oNBFSqCIIUAXkQQYqoCEGCIL13khBIgPTsef84IQkQIGCS2U3uz3XttbMzs7u/DSH3npkz5yitNUIIIYSwjpPVAYQQQojCToqxEEIIYTEpxkIIIYTFpBgLIYQQFpNiLIQQQlhMirEQQghhsVsWY6XUNKVUpFJq5w22K6XUp0qpA0qpv5VS9XM/phBCCFFw5aRlPAPocJPt9wOV029DgC/+fSwhhBCi8LhlMdZabwBibrJLN2CWNjYBRZRSpXIroBBCCFHQueTCa5QBjmd5fCJ93elrd1RKDcG0nvHy9mpQsXJFsx4FKst+WR9csz3rNqXUdfsKIYQQVjl6FKKjb7bH1mitdbFr1+ZGMc6uGmY7xqbWeiowFUCVVnpH9x3/+s2dlBPOyhlnJ+er7t1d3AnyCqKoZ1FcnVxxdXbF1ckVbzdvvFy8cHN2w83ZDV93X1ycXHBxcsl4vouTC37ufhT3Lk4RjyJ4uXrh7uyOj5sPHi4euDq7ZjzHw8UDF6fc+DEKIYRwdKmpMGmSuS9e/Prt/furo9k9LzeqyAkgOMvjssCpWz3J1dmV4r7F0Wi01mg0Nm3LWL7ROpu2ZSwnpCZg0zZs2kaKLeW69zhz6UwufLxbc3UyxflKkfZx88HVyRUn5WS+LDg5Zy4rU+y93bxxdXLNKP7OyhkvVy/83f3x9/DH390fHzcf/D388XDxwNvVG193X9yd3fFz98PbzRsPFw8CPQNxdnLOl88phPh39u2DCxcgLg7uvRdUelNm2zY4cQIOHoTSpc1+R45A+fLw2muZz9+xAwICzB95NzezzmaDrVuhVi3w9Lz5+ycmgru7ed+EBAgPh2LFoEQJKFIkM4+4cy4u8OyzN97ev/8NnpcL770UGKaUmgc0BmK11tcdor5W7RK1CX8+/F+9sdaaNJ1Gmi3tqnubtpGQkkBUfBTnE86TYkshJS2FFFsKF5MukpSWRHJaMgkpCVxOuZzxvFRbKmm2NBJTE4lOiOZi0kViEmJISksiKTWJ2KRYUtJSSLWlkmpLJcWWQnxKvHl9WwoJqQkAxCTc7BR77gvwCMDHzQc3Zzc8XDzwdffF1ck1o/Xv4+aT2fp3csZFmS8MoQGhlPMvR0mfkrg5u+Hq5IqnqyehRUKlwAtxG7Q2BfbkSVMog4LM+suX4cknTXHdsiVz/x49oF49CAw0j+vf4BqUatWuLsZNmkB8vFn29zf3sbHmPiYmsxh36QJ//WX2rV4d/vgDvLzMY5vN7HPwILRsmfnarq4me/HiEBwM774LNWqYbZGR4OEBfn45+3mkpGS+ZlZxcfDQQ+aLQOnS5lamjLkPDYWmTXP2+vYoOhrS0swXmztxy2KslJoLtAaClFIngDcAVwCt9WRgBdAROADEA4PuLMrtU0rholyyP0zsCWX8yuR5Bpu2XVWgk9KSuJR8KaPFnmZLy1xO/6KQmJpIYmoiaba0jOel2lKJS4rjUvIlziWcIz4lnguJF7iccpmk1CQuJF4gITWBxNRELiReIDE1kcvJlzmfeD7jlpvcnd0J8AygiEcRSvqUpJRPKcr5l6NS0UrUKFaDYl7F8HDxwM3ZDW83b3zcfHL1/YWwWmKiabGmpIC3t7lVq2a27dwJn38OU6Zc/7whQzLX//knzJlz/T6LF5tW74QJppDXqAG7dpl1QUGmYEZGQseOmc9JSoLKleHsWYiKyizCV8THm1YzmFb2qfTjk3/8kbnd3d0cQn3mGbOuaVPzPpGRcPGi+TJx8qT53O+8k/naL78MX39tvjyUKGFyVKsGVaua+ytF9JNPYPNm+PZbcHKCsmWhdm0IC4Pnn4eICPj55+x/3vXrmxY+mJ/JqFHQoIEp1iVLQkiI+UJgD2JjYdAg8+915fbFF7B+vfn5Pv747b+msmoKxbCwMB0e/u9axgLSbGlEx0dntN4vJV8iITUh40hAfEo8CSkJptWf3vpPTE3kRNwJzsWf40jskauOHpy5dIZzCeduO0f1oOqEFAkhyCuIQM9ASvqUxMfNB28374wiHuQVhKeLJ0qOhQkL2GymRRYRYVqJvr6ZrcxatUzx+OQTmDvXtGTPX/P91s8vswC+/z68+GL27/P226Z4AfznP7BmjSkyn3wC99wDd92VO58lNta0hi9dMsU8ays0MRFOnzattbNnzXL16qYY3+hwdkKCKcpnz8KxY9C5c2bxe/xxU2ATE69/3n33ZRbYhg3Noe9rubmZYu/qagp5+fLmNU+dyryFhMB775n9T540hTwrJydT/Dt1Ml94Kle+7R9brtm+HerWzX5beLj5EnEjSqmtWuuw69ZLMRbXunI+/lz8Oc4nnifqchTH445zLPYYf53+i1MXT3Eu4RzJackkpyVnFPOccFJOlPIpRUmfkpTwKUFx7+IEeQbh6+6bcb68YkBFmpdrLkVb3JHUVFM0vvsOevUyLdrs/rhndemS2S821vzBP3s2c1v9+qal5uUFGzeadVrDiBGmpdioEZQqZYqcSwHuy5mWZor7iROwfz/s3WvumzbNbGnPnWvWnTsHTz1lCuhff5kvAyNHmn0SEm59bvvcOdPS/PtvOHPG/PsdOZJ5iH3LFtPaBvjwQ9OSr1MHWrc26/PqT8dff5lD6m5u5gvIsWOm9/SePeZL1yOPwLx5N38NKcYiz1xKvsSuqF1EXo4k8nIkpy6eIiYhhsTURGKTYtkbvZcTcSe4kHiBpLSkHL9uaJFQ6pSsQ+WilSnrV5YW5VpQt2RdKdLiOklJ5g9yjx6mkF75s3bmjDmseugQVKx49XPKlzettTJlYNMmU2yTk2HdOrO+QgXzB95JBg22C0lJsGGDOew+enRmQW/fHlatytyveHHo0MGca69U6c7fLyEBFi0yRx2uHFUICDBf2K78XmWltbnd6vfFIYtxbGws0dHRJCcn51MqkdeynktP0+kd7mymh/yV5cTURI5fPs60vdP4Per3q57v5+5H/VL1aV+xPXVK1KFKYBUqBFSQAl2I/PMPFC1qWqMpKebcXXbnZatUMUU2IMD8kUxNvb5DkXB8W7eaUw9//gkrVphWNJiiOHs29OmTs9ex2a4upOvWmXP6//ufOSrg65t5msJmu/PW942Ksd0eVElMTOTs2bOULVsWT085z1iYaK25dPkSjUo3IiI+gmOXj3Hg/AFWHljJmUtnWHdkHeuOrMvY393ZnaKeRSnlW4raJWrTrGwzqgZVpVpQNYp7Z3Ohn3AIqanmUp6TJ03npgMHYOVKOH4cli41PYZdXc1+We3ff32LSCkpxAVVgwbm9vjj5kvX5s3mnP7ixZm9wcG0qkuXzr61/P335vnDhplz/mAOeR84YPoP7Nt3dYe5vChHdtsyPn78OD4+PgRc6R4oCp2YmBguX75McLC5jF1rzfG446w+tJpfDv/C2ctniTgTQXT8jYe7CS0SSs+aPbk39F7qlapHkFdQfsUX/4LWppfuvn3Zbx89Gv77X7O8bZtpBXt7518+Yf8OHDCnJq4UzgYNzDnfe+6B4cPh/vszO6j93//BBx+Y5cceM53s7rvP9AMA0wdh507TS/6JJ6Bx4zvP5XCHqffv309ISAiu8nW20EpJSeHIkSNUvkm3Sa01l1MuE5MQw+Hzh9l0YhM7o3ayJ3oPOyN3kph6dffPQM9AahSrQavyragcWJnm5ZpTIaBCXn8UcQt//GE6AZUoYQ4Lgjns2KQJ3H23adEcPmz26dIl8/pcIXIiNdUU0fnzzblgMJ3tGjQw/QwGD4aFC00v7aw++shcJ+7llXtZHK4Y7969m2rVqsnh6UJMa82ePXuoXr36HT0/zZbG2iNr+WHPD2w9vZU/TvyR7X71StajRrEaNCzdkDahbQgNCJXrpvNBRIQ517t8uemNesWVP0lXes5KByqRWy5cMNcBz5ljTn1csXevObqycSP8+issW5Z5ffbcuaZXfm5xyGJ8p3+ERcGRm78HWmv2RO9h04lNHIg5wI7IHaw+tDpj5LSsaharSb1S9QgrFUb9UvVpGtxUxiDPJbGxZhSm1auvXt+sGYwZA23bWhJLFDJRUeaL4Nq18OWXprd0Vjt3mi+J3bvn7iVrUoyFQ8rr34P4lHh+P/47OyN3subwGnZH7ebg+YPX7VfKpxRP1H+CxmUa0zqkNd5ucoLyTqWkQO/e5rAgwLRp5nC0/HcXhYEUY+GQrPg9SEhJYMupLWw/s50Nxzaw5tCaq4Yb9XDxoFPlTnSt2pWuVbtSxKNIvuZzNFqb6z5TU83ACGAK8sGDmcNLClFY3KgYy9mYfDRjxgwzB3P6zdfXlzp16vD555+Teu31GXlozJgxt30uvnXr1rRu3TpvAtkZT1dPWpZvyfDGw1nw8AJOjzrN4kcW81zj56geVJ3E1EQW7l7IwCUDCfpvEI/98Bg/7PmBlLScjUJWWERFmc4vTk5mUIZffsmc59XVVQqxEFnJSTALLFiwgLJlyxIXF8eCBQsYPnw4kZGRjB07Nl/e/4knnqBDhw639ZxJkyblURr75+7iTvdq3elerTsAe6L3sGj3IubunMvOyJ1Mj5jO9IjplPYtTfeq3RnZdCSViv6LoX8c3PHj5rKQay9LqlNHrvUV4kbkMHU+mjFjBoMGDWL//v1UynLl+T333MPWrVuJi4u77jlaa1JSUnC7MnlpIWPvvwdbT21l/j/zmbl9JmcvmwGNXZ1cuSf0Hp5r/Bz3V77f4oT5b9q0q2eteestMy6xXAcshBymtmsNGzbk4sWLREZGEhISQr9+/Zg2bRrVqlXDzc2NH3/8EYD4+Hj+85//EBoaipubG6Ghobz99tvYrlwDki4qKoqnn36a4OBg3N3dCQ4Opn///iQlmXGhsztM/cknn1C9enU8PT0JCAggLCyMxYsXZ2zP7jD13r176dGjB0WKFMHT05MmTZqwcuXKq/a58l779++nU6dO+Pj4UL58ecaOHXtdbkfUoHQD3m/7PiefP8mvg37l4RoPk2JLYdXBVXT8tiPtv2nPJ5s+YW/0Xquj5gmbzRx+fuedq2dAcnExAyukpcGrr0ohFuJWHPIw9c1Od06Zknnh9tSp5pzVjWQ9KHBldJbsDB5sXgvMOKg3mx7rThw+fBhnZ2d8fMy1rWvXriUiIoI33niD4sWLExISQmpqKu3bt2fXrl289tpr3HXXXWzatIm33nqLmJgYPvzwQwDOnz9Ps2bNiImJ4dVXX6V27dpERkbyww8/kJycjPu1/feBOXPmMGrUKF5//XVatGhBQkICf//9NzExMTfMfOrUKZo3b46vry+ff/45/v7+TJw4kU6dOrF8+XLuv//qFmGPHj0YNGgQI0eOZNmyZbzxxhsEBwczaFC+TX+dp5ydnGlerjnNyzXnyIUjfPbnZ0zYNIFVB1ex6uAq1E+KViGt6FOrD/1q98PT9RbT1jiAc+fMZR9XZjKqWNHMWtOoUebk8kKIHNJaW3Jr0KCBvpldu3bdcFvm/BjX36ZMydxvypSb75tV/fo33m/w4Mz9wsNvGvumpk+frgG9Z88enZKSomNiYvTkyZO1k5OT7tatm9Za6/Lly2tPT099+vTpq547a9YsDej169dftX7cuHHa1dVVnz17Vmut9WuvvaadnJz0X3/9dcMcb7zxhibLD+CZZ57R9erVu2n2Vq1a6VatWmU8HjVqlHZ2dtb79+/PWJeamqqrVKly1Wtdea9p06Zd9Xq1atXSbdu2vel7an3z3wN7tzd6r568ZbLu/G1nzRgybmU+LKPn75xvdbw7Fhmp9ahRWpcsmfl/xN1d6+XLrU4mhP0DwnU2NdEhD1PfrMRmHc5syJCb75vV1q033u9Kqxhyp1VcrVo1XF1dKVq0KE8//TR9+/Zl2rRpGdubNGlCyZIlr3rOypUrKV++PM2aNSM1NTXj1q5dO1JSUti0aRMAq1atomHDhtSrVy/HeRo2bEhERATDhw9n9erVxF853ngTGzZsoEmTJled+3Z2dqZ3795ERERcd/67U6dOVz2uVasWx44dy3FGR1QlsApPhj3Jst7LOPrcUT7t8Ck1itXg5MWT9Py+J+2/ac+BmANWx7wt8fFmvt8PPzTTyN19txmmMjHRTPouhLgzDlmMHd3ixYvZsmULe/bs4fLly8yaNYuiRYtmbC9VqtR1z4mMjOTo0aO4urpedWvUqBEA586dy7gve7NZ1LMxYMAAvvjiC/7880/at29P0aJFeeCBBzhy5MgNnxMTE5NtzpIlS6K15vz581etz/r5ANzd3UlMvHrc6IKsnH85hjcezvah2xnfdjyeLp6sOriK+lPq88FvH3A5+bLVEXPE09Mcgi5TxswXu349hIRYnUoIxyfF2AK1atUiLCyMqlWr4nFl2pAssrsGODAwkNDQULZs2ZLtrUuXLgAEBQVx8sqEnjmklOLJJ59k8+bNREdHM3PmTDZv3swjjzxyw+cULVqUM2fOXLf+zJkzKKWuK77CcHFyYVSzUex6ZhdNyzblYvJF/m/1/1F9YnWW71t+3cQW9mDPHnj5ZdMZSyn4+ms4dAjGjgVnZ6vTCVEwSDF2EB06dMiYVjIsLOy6W1CQmRqwXbt2bN68me3bt9/R+wQEBPDII4/Qs2dPdu7cecP9WrVqxaZNm65qPaelpfHdd99Rr149fH197+j9C4uQIiH89thvLOu9jOpB1Tked5wuc7tQ5qMyvL/xfbspygcPQufOZtD8KxM29OwJhfRKOyHyjEP2pi6M+vbty/Tp07n33nsZNWoUderUITk5mYMHD7J06VKWLFmCl5cXI0eO5Ntvv+W+++7j1Vdf5a677iI6OpoffviByZMnZ1skhwwZgq+vL02bNqV48eLs27eP2bNn065duxvmGTlyJDNmzKBt27a8+eab+Pn5MWnSJPbt25dxKZa4OaUUnat05r4K9/H2hreZsX0GJ+JO8OKaF5m7cy6r+q+iuHdxy/KtXWt6R0dFwbFjkJSUOf+rECJ3ScvYQbi6uvLTTz8xePBgpk6dSseOHenbty8zZ86kWbNmGYOCFClShN9++40ePXrw3nvv0aFDB0aNGoWLi8sNBw65++672bp1K08//TRt27bl7bffpl+/fsycOfOGeUqXLs3GjRupWbMmTz31FA899BAxMTH8+OOPtz26V2Hn4eLBW23e4uhzR1nYcyFl/cqy/ex2yn9cnunbpqPzeWCe+HgYNw7atDGF+L77zGVMUoiFyDsyApewa4Xx9+B47HGaT2/OsVjT27x9xfaMbjaaeyvcm+fvPXEiDBuW+bh8eTOspRyWFiJ3yAhcQjiIYP9g9g7by6cdPsXDxYOfDv7EfbPvY/Sq0aTZ0vL0vUNDzQ1gwgQ4ckQKsRD5QYqxEHbIw8WD4Y2H88/T/zC62WiclTPj/xjPvbPu5Vz8uVx/vytXmd19N3z6qek5/dxzuf42QogbkGIshB2rEFCB/7b9Lz/2MZ3i1h9dT6XPKrF49+JbPDNnbDZ46SVo2dKcK/b3N72nneQvgxD5Sv7LCeEA2ldqT8STETQp24QLiRd4YP4DfPrnp//qNbWGXr3gvffMuOxXxpgWQuQ/KcZCOIg6Jevw+2O/82brNwEYsXIEXed25VLypTt6vebNYcECM5DHihVwkyvZhBB5TIqxEA5EKcXrrV5nSucpuDu7s2zfMmpNqsWh84du63XmzYPffzfLU6ZIIRbCalKMhXBAQxoMYduT2yjnX46jsUepP6U+438fn6PnHj0KffqY5RdfNFOECiGsJcVYCAdVvVh1djy1g85VOhObFMvon0fzfz//3y2ft2KFOV9cqRK8/XY+BBVC3JIUYyEcmJ+7H0t7LWVGtxkAfPD7Bzyx9AlS0lJu+JzHHoPPPoMNG6TXtBD2Qv4rCuHglFIMrDuQ6d2m4+LkwtfbvqbdN+04e+nsVfvt3m3u3d3NKFvZzIAphLCIFON8NGPGDJRSGTc3NzcqVqzIyy+/bPncviEhITz66KMZj69kvdmcxsK+PFr3UTY8ugFfN1/WHVlHrS9qsXzfcgDmzoUaNeD11y0OKYTIlhRjCyxYsIA//viDH3/8kfbt2/Puu+8yevRoq2OJAqBpcFO2DN5CzWI1iY6PpsvcLgxe8AJ9+pgx6A8etDigECJbOSrGSqkOSqm9SqkDSqkXs9nur5RappTarpT6Ryk1KPejFhx169alSZMmtG3blkmTJnHffffx9ddfY7PZrI4mCoCqQVX5+6m/6Ve7HwBf7foQugyhTLkkZs+2OJwQIlu3LMZKKWdgInA/UAPorZSqcc1uzwC7tNZ1gNbAh0opGV4+h+rXr09CQgLR0dEZ6w4fPkzfvn0pVqwY7u7u1K1bl8WLrx8Ccfv27fTo0YPAwEA8PT2pWrUq7777bsb2VatW0bFjR0qVKoWXlxe1atXiww8/JC0tbyccENZyUk7M7jGblmfnQ4oHNPiKoNGtuJxy0epoQohsuORgn0bAAa31IQCl1DygG7Aryz4a8FVKKcAHiAFSczkrAOpNlRcve9v0G7k39eSRI0fw9/cnMDAQgOPHj9O4cWOKFy/OhAkTKFasGN999x0PPvggS5YsoWvXrgBs3ryZ1q1bU6lSJSZMmEDZsmXZv38/f//9d8ZrHzp0iHvvvZfhw4fj4eFBeHg4Y8aMISoqivfeey/XPoOwP7//Dhu+eBjKlMPvyW5sP/cnfRb1Ye6Dc/Fx87E6nhAii5wU4zLA8SyPTwCNr9nnc2ApcArwBR7RWl93zFUpNQQYAlCuXLk7yVsgpKWlkZqaysWLF1m8eDELFy7k448/xtnZGYAxY8agtWb9+vUZBbp9+/YcP36c119/PaMYv/DCCwQGBrJp0ya8vLwAaNOmzVXvNXTo0IxlrTUtWrQgOTmZ8ePH88477+Ak17YUSFrD8OFmuaxqzM9PrSNsahjL9y2n8meVmfPAHNqEtrn5iwgh8k1OinF2TdFrm4XtgQigDVAR+Fkp9avWOu6qJ2k9FZgKEBYWdkdNy9xskVqlWrVqVz1++umnGZZlRveVK1fSsWNH/P39SU3NPMDQvn17Ro8eTVxcHC4uLvz222+MHj06oxBn5/Tp04wZM4aVK1dy6tSpq14vMjKSkiVL5uInE/ZCKVi7FqZNM5cxubhUY/WA1fRZ2IfDFw7Tc0FPVvVfRf1S9a2OKoQgZx24TgDBWR6XxbSAsxoELNLGAeAwUA2RrcWLF7NlyxZWrFjBfffdx6RJk5g1a1bG9sjISGbNmoWrq+tVtys9rs+dO8f58+ex2WyULVv2hu9js9no2rUry5cv59VXX+WXX35hy5YtvPLKKwCWX04l8pafn5mT2CX9K3eTsk3YO2wv9UvV51zCORp+2ZC3N7yN1o7/BVcIR5eTlvEWoLJSKhQ4CfQC+lyzzzHgXuBXpVQJoCpweyPXFyK1atWiUqVKgDmsXLt2bUaPHs2DDz6It7c3gYGBtGjRgv/85z/ZPr906dKkpaXh5OTEyZMnb/g+Bw8eJDw8nNmzZ9OvX7+M9cuWLcvdDyTsRng4TJgAX38NHh7Xb3d1dmVVv1U8v+p5Zm2fxatrX6VaUDUerPFg/ocVQmS4ZctYa50KDAN+AnYD87XW/yilhiqlrpyQfAtoppTaAawB/qO1js7+FUVW7u7ufPDBB0RGRjJp0iQAOnTowN9//03NmjUJCwu77ubu7o6XlxfNmzfnm2++ISEhIdvXjo+PB8DV1TVjXUpKCnPmzMn7Dyby3enT0LAhfPstTJx44/0CvQKZ2X1mxlSMvRb24rud3+VTSiFEdnLSMkZrvQJYcc26yVmWTwEyCdsd6tq1Kw0bNmT8+PEMGzaMsWPH0qhRI1q2bMmwYcMICQnh/Pnz7Ny5k0OHDjFt2jQAxo8fT6tWrWjatCmjRo2ibNmyHDp0iIiICD777DOqV69O+fLleeWVV3B2dsbV1ZUJEyZY/GlFXqle3dzXq2fOE9/Kqy1f5cylM3wR/gUDlwwk2D+YZsHN8jakECJb0pXWTowbN47IyEgmT55MuXLlCA8Pp06dOrz88su0bduWp556ivXr11/VW7phw4b89ttvBAcHM3z4cDp27MgHH3yQcR7Zzc2NJUuWULJkSQYMGMAzzzxDy5YtefHF68ZtEQ5u1SqIjTXLX31lxp++FSflxMSOExlQZwBJaUn0XtibnZE78zaoECJbyqrOG2FhYTo8PPyG23fv3k31K1/1RaElvwe3duECBASY5U6dYPny23t+QkoCLaa3YOvprRTzKsbvj/9OpaKVcj+oEAKl1Fatddi166VlLIQDs9ngSt+8qlUhm0HabsnT1ZM1A9bQsHRDouKjaD2jNZGXI3M3qBDipqQYC+HAnJygWzczHeKKFZClr95t8ffwZ82ANdQvVZ+TF0/y7P+ezd2gQoibkmIshIMbPBgOHIAKFf7d6/i6+7Lg4QV4u3rz3T/f8c3f3+ROQCHELUkxFsIBHT4MERGZj28yCNttqRBQgY/afwTAkGVD+HHfj7nzwkKIm7LrYiwjAxVu8u+fvago0wquXx9Wr8791x9cfzA9a/YkITWBnt/3ZMX+Fbd+khDiX7HbYuzq6nrDwSxE4ZCQkHDVgCXCTABRp07mcs2auf8eSinmPTiPx+s9TnxKPP0W9ZMOXULkMbstxsWLF+fkyZPEx8dLC6mQ0VoTHx/PyZMnKV68uNVx7MoTT5iRtgCOHDEdt/KCUoovu3xJm9A2nE88T88FPYlLirv1E4UQdyRHI3BZwc/PD4BTp06RkpJicRqR31xdXSlRokTG74GAnTvNLExgxp4uXz5v308pxbSu06g3pR7rj66n1/e9WNp7KS5OdvtnQwiHZbeDfgghrla7NuzYYZbz87/tnyf+pM2sNsSnxNIu6+QAACAASURBVDOgzgBmdJuBUtnNrCqEuBUZ9EMIB5aWBufOmeU//sjf925ctjGLei7Cw8WDWdtn0fHbjnLIWohcJsVYCAfg7Azffw8ffABNmuT/+7ev1J4ljywhwCOAlQdW0vTrppy9dDb/gwhRQEkxFsJBNG0KL7xg3fu3r9SeXwf9SqWildgVtYtnVjxjXRghChgpxkLYsdOn4f77wV66V9QsXpNV/Vbh7erNwt0LWfDPAqsjCVEgSDEWwo517QorV8Lbb1udJFNoQChjWo8BoM+iPjJKlxC5QIqxEHbqjz8yW8Tvv29tlmuNajqKIfWHkGpLpe+ivvwT+Y/VkYRwaFKMhbBT48eb+0cfhSpVLI1yHaUUX3T+gh7VehCbFEu/xf1ISZPxAIS4U1KMhbBDmzbBokXg5mZfh6izclJOzOoxi5AiIUScieCjPz6yOpIQDkuKsRB2Ji0Nnn7aLI8aBaVLW5vnZnzcfJjSeQoAY9aPYf+5/RYnEsIxSTEWws7s2AEHD0JwMLzyitVpbq1dxXYMrDOQxNRE+i3ux+Xky1ZHEsLhSDEWws7UrQvHjsHy5eDtbXWanPmo/UcEeASw+eRmBi4ZaHUcIRyOFGMh7JC/vxmL2lEU9SzKz/1/xt3ZnYW7F7LpxCarIwnhUKQYC2EnoqJg3Di4dMnqJHemQekGPNv4WQAe++ExLiResDiREI5DirEQduKTT+C112DwYKuT3Ln/u/v/CCkSwu7o3Yz8aaTVcYRwGFKMhbAD585lXsL07LPWZvk3gryC+F/f/+Hu7M6MiBks3r3Y6khCOAQpxkLYgaFDzX2zZmZCCEdWLagaLzV/CYCHFjzEnyf+tDiREPZPirEQFjt0yEyPCPDuu9ZmyS0vtXiJnjV7YtM2Bi4ZSGxirNWRhLBrUoyFsNjo0eb+oYegZUtrs+QWN2c3ZnSbwV3F72Lvub08/9PzaK2tjiWE3ZJiLISFwsPNsJcAL71kbZbc5unqyVddv8LFyYVpEdP48q8vrY4khN2SYiyEhby8oGFDGDEC6te3Ok3ua1SmEZ90+ASAMevGcD7hvMWJhLBPUoyFsFD16rB0KUyYYHWSvDM0bChNyjbh9KXTDPphEDZtszqSEHZHirEQFoiPh7lzzXLJkqCUtXnykpNyYnaP2fi7+/PD3h94c92bVkcSwu5IMRbCAu+/D336wHPPWZ0kf1QqWolvH/wWgLEbxrL+yHqLEwlhX3JUjJVSHZRSe5VSB5RSL95gn9ZKqQil1D9KKfmfJsQNbN8OY8ea5QcftDZLfupYuSMvNH0BgMeWPkZcUpzFiYSwH7csxkopZ2AicD9QA+itlKpxzT5FgElAV611TeDhPMgqhMO7dMnMygTQv3/BuZQpp8a1GUfdknU5dP4Qjy99XM4fC5EuJy3jRsABrfUhrXUyMA/ods0+fYBFWutjAFrryNyNKUTB8PHHmcuff25dDqu4u7gz78F5+Lj58P2u75kSPsXqSELYhZwU4zLA8SyPT6Svy6oKEKCUWqeU2qqUGpDdCymlhiilwpVS4VFRUXeWWAgHdfFiZjH+4gvw87M2j1WqBlXlqy5fAfDGujdkdichyFkxzq6f57VD6bgADYBOQHvgNaVUleuepPVUrXWY1jqsWLFitx1WCEf25ZdmQohmzeDJJ61OY62eNXvSLLgZUfFRPLfyORmdSxR6OSnGJ4DgLI/LAqey2Wel1vqy1joa2ADUyZ2IQhQMzz5rRtv6+OOCfSlTTiil+Pz+z/F08WTm9plMj5hudSQhLJWTYrwFqKyUClVKuQG9gKXX7PMD0EIp5aKU8gIaA7tzN6oQjs3FBXr0MCNuCahXqh5TOptzxsP/N5xdUbssTiSEdW5ZjLXWqcAw4CdMgZ2vtf5HKTVUKTU0fZ/dwErgb2Az8JXWemfexRbCcezfDzvlf0O2+tXuR7/a/YhPiafngp4kpSZZHUkISyirztWEhYXp8PBwS95biPyiNbRrB2vXmhG3HpaL/q4TlxTHXV/cxbHYY7zU/CXeufcdqyMJkWeUUlu11mHXrpcRuITIQ++9B6tXg68vtGljdRr75Ofux5wH5gDw6Z+fciDmgMWJhMh/UoyFyCNpafDyy2Z5xAgIDLQ2jz1rXq45D1R/gMsplxm4ZCDJaclWRxIiX0kxFiKPZJ2J6dVXrcvhKKZ2nkpp39L8fvx3xm0YZ3UcIfKVFGMh8sDhwzB6tFl+/XXTk1rcXKBXIHMfnItC8e7Gd9lycovVkYTIN1KMhcgDI0aY++rVYcwYS6M4lJblWzKi8QhSbakMXDKQxNREqyMJkS+kGAuRB6akD7k8Z44M8HG73rn3HaoGVmV39G6GrRhmdRwh8oUUYyHyQKlS5rKmevWsTuJ4PF09mfPAHJyUE19v+1rmPhaFghRjIXLRiRNmmkTx7zQo3YBXWrwCwBPLniA+Jd7iRELkLSnGQuQSrWHAAAgNhfXSmPvXXm7xMpWKVuJAzAFeWPWC1XGEyFNSjIXIJfPmmZG2tIZataxO4/g8XDyY2X0mTsqJL8K/4JfDv1gdSYg8I8VYiFxw5gw884xZ/u9/ZYCP3NIsuBmvt3wdgIcXPMyJuBMWJxIib0gxFiIXvPginD8PjRvDo49anaZgeaXlK7Sr2I6YhBie/+l5q+MIkSekGAvxL61bBzNngrs7fPUVOMn/qlzl4uTClM5TcHd2Z8GuBczdMdfqSELkOvmzIcS/YLPBs8+a5ZdflnPFeSWkSAjv3fceAP0X95fLnUSBI8VYiH/ByQmmT4e+feG556xOU7CNaDyCEY1HkKbT6Pl9T5ndSRQoUoyF+JcaNIDZs8HPz+okBZtSivHtxtO2QlsiL0fSdnZbTl88bXUsIXKFFGMh7oDWsHVr5mMZ8jJ/uDi5sOiRRTQs3ZAjF44w7H8yXKYoGKQYC3EH3nkHwsKgVy+rkxQ+Pm4+LHh4gSnMuxfx+/HfrY4kxL8mxViI23ToELz9tlnu3t3aLIVV+SLlefHuFwF4fOnjXEy6aHEiIf4dKcZC3Aat4cknISEBunWTlrGVXmrxElUCq7Aneg///e2/VscR4l+RYizEbZg9G1avhqJFYepUq9MUbl6uXkzrOg2AzzZ/RmxirMWJhLhzUoyFyKHISBg50ixPmADFi1ubR8Dd5e6mdUhrYpNieX3t61bHEeKOSTEWIofefx9iYqBtW+jf3+o04or373sfJ+XE51s+J+JMhNVxhLgjUoyFyKFx4+CVV2DyZLmUyZ40KtOIJ+o9gU3bGPTDINJsaVZHEuK2STEWIoc8PU1BrlDB6iTiWh+0+4AyvmWIOBNBn0V9SExNtDqSELdFirEQt/D99xArfYPsmp+7HzO7z8TN2Y35/8xnxP9GWB1JiNsixViIm1i/Hnr2hLvugvh4q9OIm7m3wr2sHbgWVydXpv41lUW7F1kdSYgck2IsxA0kJsKQIeba4oEDwcvL6kTiVpoFN+ODth8AMHjZYI5eOGpxIiFyRoqxEDfw0EOwbx9Uqwavvmp1GpFTwxsPp0W5FsQkxPD0iqfRWlsdSYhbkmIsRDa2bYMffzTLs2aBu7u1eUTOOSkn5j44F393f1bsX8F3/3xndSQhbkmKsRDXSEqCJ54wy3XqQMOG1uYRt6+MXxnGtxsPwNDlQzkee9ziRELcnBRjIa6xahX89ReEhpoOXMIxPV7vce6vdD+xSbH0X9xfDlcLuybFWIhrdOkC69bBd9+Bv7/VacSdUkoxrds0/Nz9WH90Pd/8/Y3VkYS4ISnGQmSjVSs5PF0QlPQpyYT2EwAY+uNQ9kTvsTiRENmTYiwEmZcvrVhhdRKR2wbVHUSvWr2IT4ln2Iph2LTN6khCXCdHxVgp1UEptVcpdUAp9eJN9muolEpTSj2UexGFyHsffWR6TQ8YAJcuWZ1G5CalFJ90+ARfN1/WHF7D55s/tzqSENe5ZTFWSjkDE4H7gRpAb6VUjRvs9z7wU26HFCIvhYfDi+lfMb/6Cnx8rM0jcl9x7+IZvatH/zyav07/ZXEiIa6Wk5ZxI+CA1vqQ1joZmAd0y2a/4cBCIDIX8wmRpxITTWs4NRVGjIDu3a1OJPLK4PqD6V+7P8lpyTy84GHikuKsjiREhpwU4zJA1ov0TqSvy6CUKgP0ACbf7IWUUkOUUuFKqfCoqKjbzSpErnv9ddi9G6pUgXfftTqNyEtKKaZ0nkK9kvU4dP4QQ5cPlcudhN3ISTHObubWa3+DPwb+o7W+6USiWuupWuswrXVYsWLFcppRiDyxbBl88IGZm3j6dDNFoijYPF09mffQPLxdvZm7cy5fb/va6khCADkrxieA4CyPywKnrtknDJinlDoCPARMUkrJAT9h14oVA2dnM+50s2ZWpxH5pUpgFSZ1mgTAiJUjOHvprMWJhMhZMd4CVFZKhSql3IBewNKsO2itQ7XWIVrrEOB74Gmt9ZJcTytELmrcGPbvhzFjrE4i8tuAOgPoXKUz8SnxvLfxPavjCHHrYqy1TgWGYXpJ7wbma63/UUoNVUoNzeuAQuS2nTvNvVJmyEsnudq+UBrbeiwKxcQtE9kVtcvqOKKQy9GfIa31Cq11Fa11Ra312+nrJmutr+uwpbV+VGv9fW4HFSI3LFkCd90FL7xgdRJhtXql6jGw7kBSbCn0XdSXlLQUqyOJQkzaBKLQOH4cHnvMLJcpc/N9ReHwcfuPKeNbhogzEYz/fbzVcUQhJsVYFAopKdC0KZw/D506wXPPWZ1I2AN/D3+md5sOwNgNYzl0/pDFiURhJcVYFHhaQ9eucPIkeHvDjBnmfLEQAG0rtqV3rd4kpibSZmYbzsWfszqSKISkGIsC7803YeVKs7xyJQQFWZtH2J8J7SdQIaACR2OPMmLlCKvjiEJIirEo0BITYdEi02N64UJo3tzqRMIelfApwQ+9fsDVyZU5O+awO2q31ZFEISPFWBRoHh6wcaMpyA88YHUaYc9qFa/FwDoDAei/uL8MBiLylRRjUSDFxppzxQB+ftAtu6lNhLjGa61eI6RICFtPb+WhBQ+Raku1OpIoJKQYiwLn/HlzOHrQIEhKsjqNcCTl/Mux/tH1lPQpycZjGxm7fqzVkUQhIcVYFCgxMdCmjRlla/NmiI+3OpFwNOX8y/HtA9+iUIzbMI41h9ZYHUkUAlKMRYERFwf33w8REVC5MqxaBQEBVqcSjuie0Ht4vdXraDR9F/WVy51EnpNiLAqES5egc2fTGg4JgV9+gbJlrU4lHNlrLV+jRbkWnL18lud+klFiRN6SYiwcXnKy6Sn9669mmMs1a6QQi3/P2cmZad2m4e7szpy/57Dl5BarI4kCTIqxcHgXL5re08WLmxZxhQpWJxIFRaWilRhcfzAaTZe5Xdh+ZrvVkUQBJcVYOLzAQFi7FtavhypVrE4jCpoP239I2wptOXv5LB3mdOBY7DGrI4kCSIqxcEgpKfDJJ5CafhmolxdUq2ZtJlEwuTm7sbT3UhqXacyZS2foNq8bCSkJVscSBYwUY+FwUlKgf38z89IIGUZY5AMPFw+W9l5KhYAKRJyJ4Pmfnrc6kihgpBgLh5KYCI0bw3ffmRmYBg60OpEoLIp7F2dRz0W4OLkwZesUNp/cbHUkUYBIMRYO4+JF6NIFtm0zj9etg0aNLI0kCpk6JeswsslINJr+i/sTlxRndSRRQEgxFg7h5Elo2RJWr4ZixczAHmFhVqcShdHYe8ZSs1hN9p3bR42JNdh0YpPVkUQBIMVYOISXXjIFuFIl+P13qFPH6kSisPJw8WDRI4uoHlSdkxdP0n1ed45cOGJ1LOHgpBgLh/DFFzByJGzaZAqyEFaqEliF7UO30ya0DWcvn6Xd7HaciDthdSzhwKQYC7uUlgaffZY50YO3N3z0kbmmWAh74OrsysKeC6lUtBL7Y/bTZmYbGcNa3DEpxsLuxMSYcaaffRaGDrU6jRA3VsSjCD/1+4mKARXZH7Ofu6fdLZ26xB2RYizsyvbt0LAhrFxpWsFy6ZKwdxUCKvDLwF+oGliVvef28vra162OJByQFGNhN+bOhaZN4dAhqF8ftm6Fe++1OpUQt1bOvxyze8zGWTnz2ebP2HZ6m9WRhIORYiwsZ7PB889Dnz6QkGBawxs3QvnyVicTIucalmnI0w2fxqZt9Py+J2cvnbU6knAgUoyF5ZQy54ldXGDiRJg+HTw9rU4lxO177773qFmsJgdiDtD9u+6cTzhvdSThIKQYC8tcumTulTJFeONGePpp81gIR+Tl6sXqAasp7VuaTSc20fTrptJCFjkixVjku4QE01va1zezIHt7mzGnhXB0JX1KsuHRDVQMqMjec3t5cP6DXE6+bHUsYeekGIt89eefZjzpH380jzdutDaPEHmhYtGK/Nz/ZwI9A/nt+G/c9cVdLN692OpYwo5JMRb5IioKHn8cmjSBnTvBwwOWLYMOHaxOJkTeCA0IZeNjG6ldojaHLxzmgfkPsOCfBVbHEnZKirHIc7NnQ5UqMG0auLrCiy9CdLQ5VC1EQVYtqBpbh2zl9Zbm2uNHf3hULnsS2ZJiLPKcvz9cuADt2sGOHfDuu+YcsRCFgYuTC2Naj+HRuo8SnxJP+2/as/XUVqtjCTsjxVjkurVr4eOPMx936QK//WZG1apa1bpcQlhFKcXkTpOpX6o+UfFRdJjTQWZ6ElfJUTFWSnVQSu1VSh1QSr2Yzfa+Sqm/02+/K6VkgrtCaNs2cw64TRsYNQr+/tusVwqaNZNLlkTh5u7izsZBG2lfsT3R8dH0W9SPNFua1bGEnbhlMVZKOQMTgfuBGkBvpVSNa3Y7DLTSWtcG3gKm5nZQYb927oQBA6BBA/jpJ3PJ0ptvQkiI1cmEsC+erp7MfXAupX1L89vx3xi3YZzVkYSdyEnLuBFwQGt9SGudDMwDumXdQWv9u9b6ylAzm4CyuRtT2CObDR58EO66y3TScnExcw4fOgSvvgp+flYnFML+BHgG8HXXrwEYs34Mb6x9A621xamE1XJSjMsAx7M8PpG+7kYeB/6X3Qal1BClVLhSKjwqKirnKYXd0NrcAJycTEcsDw946inYs8fMORwUZG1GIexdh0odmN5tOk7KibEbxvLI94/IIetCLifFOLszfdl+jVNK3YMpxv/JbrvWeqrWOkxrHVasWLGcpxSWi4qCsWNNB6wVKzLXv/MOHD0KkyZBhQrW5RPC0Txa91EW9VwEwIJdC+j5fU9pIRdiOSnGJ4DgLI/LAqeu3UkpVRv4CuimtT6XO/GElVJTTeHt2RPKlIE33oD9++HTTzP3KVsWihe3LqMQjqxbtW4s770cXzdfFu1exAurXpCCXEjlpBhvASorpUKVUm5AL2Bp1h2UUuWARUB/rfW+3I8p8ttnn5kC3KkTLFgAaWlQs6aZc/iHH6xOJ0TB0alKJ+Y/PB9XJ1c+2vQR72581+pIwgK3LMZa61RgGPATsBuYr7X+Ryk1VCk1NH2314FAYJJSKkIpFZ5niUWeOH0azmaZXEZriIw0h6XfeguOHTO9pnv1MueIhRC5p0OlDnzzwDcoFK/88grjNoyTFnIho6z6Bw8LC9Ph4VKzrXTkiJmwYcEC2LAB/u//4L33zLZz50yv6LAwuT5YiPzy5dYvGfrjUGzaxjMNn+HT+z/FScnYTAWJUmqr1jrs2vUuVoQR1vnjD1i82BThXbsy17u5QWxs5uPAQHMTQuSfwQ0GE+AZQO+FvZm4ZSLxKfFM7TIVFyf5U13Qyb9wAXfihLne98o1v9Onw5dfmmVfXzNedNeu0K2bGUNaCGGth2o8hLuzOw/Mf4DpEdPZHb2b7x/+njJ+N7uiVDg6Of5RwCQlwZo1MHq0GYwjOBgWLszc/sQTZqjKNWvMzEnff29Gz5JCLIT96FK1S8Z8yJtObOL+OfcTlxRndSyRh6RlXEBMmACrVsGvv8Lly5nrvb1N0b2iUSNzE0LYt9YhrdkzbA8tprdgR+QO2s5uy9JeSynhU8LqaCIPSMvYgWhtejXPnw8vvAApKZnbli83syJdvgy1a5vOWL/8AjExppUshHA8QV5BrOizgmC/YDaf3EyL6S3YcnKL1bFEHpDe1HYsPt70ct68GcLDzX3Wy482b4aGDc3yjz9CXBy0agWlS1uTVwiRN07EnaDxV405dfEU7s7uLOm1hA6VOlgdS9yBG/WmlmJsB5KSYPduM+Wgh4cZ8QrgwAGoXPnqfQMCzGHmZs2gf38IDc3/vEKI/BcdH82jSx7lx/0/4qScGHfPOEbfPVp6WjsYKcZ25LffzCHkXbtMAd6714xwBea63i3pR6FsNtPbuXZts75RI6hYUa77FaKwsmkbb6x9g3G/mqkXKxWtxIT2E+hcpbPFyUROyXXG+cBmgzNnzGAaR4+a+yu3d94x8/0CLFkC48dnPs/JCapUMUU3a+cqJydYvTr/8gsh7JuTcuKtNm9Ru0RtXlrzEgdiDtBlbhd61+rNO/e+Q0iREKsjijskLePbkJYGp05lFlp3d3j4YbMtKspMmpCcnP1zZ8yAgQPN8s8/m1v16ubyo5o1wdMzPz6BEKKgSElL4bPNn/HSmpdITkvGx82HLzp9Qd+7+qLk8JndksPUt2CzmSEgT50yUwH6+pr1U6fCd9+Z4nvsmJnJ6Ip69eCvv8yy1uDlZZ4XEgLly5v7K8sNG0IJuSJBCJHL9p/bz7Mrn2XlgZUAdK3ala+6fEUxb5mm1h4VusPUNhtcuGBarFFRplDWr2+2nT0Lzz+fuS0qykyKcOVSoTVroE0bs3z4sDm/e0XJkpmFtlatzPVKmcuIpIUrhMhPlQMrs6LPCr7860ue/+l5lu5dSvG9xXms7mO81eYtSvvK5RWOwO5bxqmppsV64UL2t6eeyhzq8cUXzSU+UVFmoIsrnaIAOnY028Bsz24O3oAAM23gJ59kFuNdu+D4cVN8y5WTYiuEsF/bTm9j5E8jWX90PQDl/Msx78F5NA1uanEycYXdHaYOCQnTjz0WTlwcGbfYWFNgH37YtFzBtFLvu+/Gr7N7N1SrZpb794dvvsnc5ucHxYqZ2913Z3aaSkuDOXMytxUrZoqzFFohREGwN3ovA5YMYPPJzSgU/Wr34/mmz1O3ZF2roxV6dleMvbzCdEJC9i3jIUNgyhSzvG0btG8PRYqYW0BA5nKRIjBiROYgF/v2mYEyihWDoCDTwUoIIQqjpNQkXv3lVT7840M05u/84PqDeffedwn0kinZrGJ3xTg4OEwPHBiOn5+ZpMDX19wXKWImNyhXzpJYQghRoOw7t49JWybx+ebPSdNplPIpxQdtPzCzQ7lIiyW/2V0xtrfe1EIIUZBtO72NZ1c+y8ZjGwEI9gtmZJORPFbvMfw9ZNq2/HKjYiwTRQghRCFQr1Q91g1cx8SOE6keVJ3jccd5ftXzlP+4PG+tf4vE1ESrIxZq0jIWQohCJs2Wxg97f+CzzZ+x7sg6ACoXrczoZqPpUrULJX1KWhuwAJPD1EIIIa6zYv8Knlv5HPtj9gNmyM3u1bozptUYahWvJaN55TI5TC2EEOI6HSt3ZMdTO/iqy1d0rtIZhWLR7kXUnlybBlMbMDNiJlY12goTaRkLIYTIsDNyJ+//9j7L9i4jNikWgPql6jO181QalG5gcTrHJ4ephRBC5NjFpIt8u+NbXlrzEucTzwPQqXInmpdrTt+7+hLsH2xxQsckxVgIIcRtu5B4gTfWvsHkrZNJTsuclm5Q3UE8Xu9xmgU3k/PKt0GKsRBCiDt2+uJpfjr4EzMiZrDx2EbStBn8v1LRSvSs0ZPWIa1pXLYxfu5+Fie1b1KMhRBC5Ir95/bz8i8v8+vRXzl7+exV28JKh9E8uDldq3alZfmWODs5W5TSPkkxFkIIkavSbGmsP7qeeTvnsXTvUqLio7BpW8Z2P3c/OlbuSPeq3elerbsMv4kUYyGEEHnsYtJFtpzawqqDq5i3cx5HY49mbCvvX57WIa1pWrYpD1R/gGLexSxMah0pxkIIIfKN1poDMQdYtm8Zk7ZM4uD5gxnbnJUzTco2oWPljtQoVoPqQdWpVLRSoTikLcVYCCGEJeJT4vn16K8cPH+Q5fuW8/Ohn0m1pV61j7erN7VL1KZj5Y50q9qtwI7+JcVYCCGEXYhLimPVwVVsOLqB/TH7+fvs35y6eOqqfUr5lKJ1SGuC/YIp41eGWsVrUbdkXYp6FrUode6QYiyEEMJunbp4im2nt/HOxnfYE72HmISY6/ZxVs40DW5KaJFQapeoTbWgalQJrEJokVBcnV0tSH37pBgLIYRwCDZtY8fZHfx1+i9OXTzFvph97I3ey9bTW687vA2mSIcUCaFS0UrUKFaDuiXr0rB0QyoVrWR3RVqKsRBCCIcWHR/NuiPr2B21m6OxRzl4/iAHYw5yPO54tvu7OLlQuWjljE5i1YtVp2JARcr5lyPQKxA3Z7d8/gRSjIUQQhRQCSkJHL5wmF1Ru9gZuZMtp7awK2oXRy4cuenzfNx8KOJRJONWwrsE94Tcg7+HP/7u/vi4+eDj5oO3m3fmsqs3bs5ud9y57F8VY6VUB+ATwBn4Smv93jXbVfr2jkA88KjW+q+bvaYUYyGEEHnpcvJl9p7by66oXeyO2s2ec3s4dP4Qpy6e4lz8uYwhPW+Xi5NLRmG+UqR93X3xdfM1y+n3qbZUQgNC8XDxyLj1vqt3tsXY5VZvqpRyBiYCbYETwBal1FKt9a4su90PVE6/NQa+SL8XQgghLOHt5k39UvWpX6r+ddts2kZcUhyxibHEJsWyN3ovB2IOcDzuOBcSLxCbFMul5EtcTr7MpeRLZjnFLKfaUrmQeIELiRdyLestizHQCDigtT4EoJSaB3QDshbjbsAsbZrZm5RSRZRSpbTWp3MtqRBCCJFLnJRTxuFpgNolaufoeVprktOSMwrzldvFeyz/iQAACehJREFUpIvmPvkiF5Musj9mP27ObiSmJmbcElITmM/8bF83J8W4DJD17PgJrm/1ZrdPGeCqYqyUGgIMSX94SSm1Nwfvn1eCgGgL399q8vkL7+cvzJ8d5PPL57f285fPbmVOinF2Z6mvPdGck33QWk8FpubgPfOcUio8u+P2hYV8/sL7+QvzZwf5/PL57fPzO+VgnxNAcJbHZYFTd7CPEEIIIbKRk2K8BaislApVSrkBvYCl1+yzFBigjCZArJwvFkIIIXLmloeptdapSqlhwE+YS5umaa3/UUoNTd8+GViBuazpAObSpkF5FznX2MXhcgvJ5y+8CvNnB/n88vntkGWDfgghhBDCyMlhaiGEEELkISnGQgghhMUcvhgrpYYrpfYqpf5RSv03y/qXlFIH0re1z7K+gVJqR/q2T9OH8kQp5a6U+i59/Z9KqZAszxmolNqffhuYZX1o+r7705+b/6OOmxwvKKW0Uiooy7oC/fmVUh8opfYopf5WSi1WShXJsq1Af/Z/QynVIf3nckAp9aLVeW6HUipYKbVWKbU7/f/7iPT1RZVSP6f/W/yslArI8pw8/13IT0opZ6XUNqXU8vTHhemzF1FKfZ/+/363Uqppgfr8WmuHvQH3AKsB9/THxdPvawDbAXcgFDgIOKdv2ww0xVwb/T/g/vT1TwOT05d7Ad+lLxcFDqXfB6QvB6Rvmw/0Sl+eDDxlwc8gGNO57igQVFg+P9AOcElffh94v7B89n/xM3NO/3lUANzSf041rM51G/lLAfXTl32Bfen/3v8FXkxf/2J+/y7k88/geeBbYHn648L02WcCT6QvuwFFCtLn///2zjVWrqqK47+/XFqSQrXl0V5FI9dYPhQjGDHWR7lWDNg2BZWINSYin3iZNJqQlCZYSQwGI0IkwSYYDPZqLbW1JK1e6cNaTFsfSA0mNhS5SuUlllKwpFJYfth7nJnjzL13crlz7sz8f8nJnLPO3mevtefMrDl771mr9A/YBN+c9cDFDeQrgZU1x8O58/uBv9TIlwNrasvk/T5ShBbVlsnn1mSZcpmKQ1gADJfQBxuA9wIjVJ1xz9if2/4UMNSLtrfYT3V6Fvuq0zZgMylm/gGgP8v6gQPtuhfabO/ZwHZgEVVn3Cu2zwSeIC86rpF3jf2dPkw9D/hoHlLYJenCLG8WnvNteb8or6sTESeAF4HTR7nW6cCRXLZ4rbYgaRnwj4jYXzjVE/bXcDXpFy70nu2t0MyejiMPIV4A7APmRI5rkF/PysXacS+0kzuAG4HXa2S9YvsA8E/g3jxMf4+kGXSR/eMJh1kqkrYBcxucWkXSfxbwQeBCYL2kAZqH5xwtbGerdcYVAnSijGH/TaTh2v+r1kDWcfaPZntEbM5lVgEngKFKtSZ6dZTtk0Sn6l2HpFOBnwIrIuKomueVbce90BYkLQWei4g/SBocT5UGso60PdMHvA/4ckTsk3QnaVi6GR1n/5R3xhFxcbNzkq4FNkYaO/itpNdJQcCbhec8lPeLcmrqHJLUB7wZOJzlg4U6vyINYbxFUl/+FTUpIUCb2S/pPaS5kP35y+hs4GFJH6BL7B/tvYe0qAJYCnw83wPQJbZPEh0ftlbSySRHPBQRG7P4WeUscZL6geeyvB33Qrv4MLBM0mLgFGCmpLX0hu0V3Q5FxL58vIHkjLvH/naO+0/CPMI1wC15fx5pKEHAfOon7/9KdfL+d6Qn6crk/eIsv576yfv1eX82aa5iVt6eAGbnc/dTv4jnuhL7YoTqnHHX2w9cSkrjeWZB3vW2T6DP+nJ/nEN1Adf8svVqQX8B9wF3FOTfon4Rz23tvBdK6IdBqnPGPWM7sBs4N++vzrZ3jf2lf8Am+OZMA9YCjwIPA4tqzq0iraA7QF4tl+Xvz+UfB+6iGoXsFNIX7EHSaruBmjpXZ/lB4Es18oFc9mCuO73EvhghO+NesD+3+STwSN6+1yu2T7DfFpNWIT9OGu4vXacWdP8IaXjwTzXv+2LSvN524LH8OrumzqTfCyX0wyBVZ9wztgPnA7/P7//PSI6xa+x3OExjjDGmZDp9NbUxxhjT8dgZG2OMMSVjZ2yMMcaUjJ2xMcYYUzJ2xsYYY0zJ2BkbMwkoZdEaaxvJZX8g6dAYl2wLklZn3d6QgECV642j3GBud/CNaNeYTmPKR+AypkNZUDjeRApCsLpGdrxt2hhjpjR2xsZMAhGxt/ZY0nHg+aJ8okiaHhF26sZ0OB6mNmaKIOkCSbslHctJzK8pnL8qD+UulHS/pCOkrEWV8xdJ2i7pJUn/ljQs6bzCNS6R9BtJL0p6OSdev7mBOudI2pLL/E3SzZLeVLjWuZI2SToi6RVJeyVdOg47z5T0I0lHc937SLlpjelZ7IyNmRrMJCWNXwtcRoqfe7ekjzUoO0SKj3sFOXONpCWkcIAvA18APg+cBuyW9PZcZgB4gBQ69UpgGXA7MKNBG5uAHcDlpNCDXwe+WDkp6a3AQ6Rc2jcAnwWOAFskfXIMWzeSEnzclPU4AXx3jDrGdDUepjZmanAaKdnETgBJvyalx1wO7CyU3RARNxZkdwK7IuKyikDSTlKA/K8CK0gp6KYB10bE0VxsRxN9vh0R9+b9bZIWZV0qsq+QYgMviIiDub2tpOQd36CaX7oOSZ8gxZheHhHrsnhY0s+pz6ZjTE/hJ2NjpgbHKo4YIM8DPwa8o0HZTbUHkt4NvAsYktRX2YBjwB5gYS76CPAqsE7SFZLOojlbCsePFnRZCOytOOKs82vAj4HzJc1sct0FwGukNIi1rGtQ1piewc7YmKnBCw1kx0mZZIo8XTiuONXvk5xt7baUlNmG7DgvIX3ufwg8I2mfpIsatHF4DF1mN9AD4BlSarpZDc4B9AMvRMSrBfmzTcob0xN4mNqYzqP4v91/5deVwLYG5f/zv4rp6XunpOmkhPW3kOZ53xkRz7egw2FgbgP53Kxf0ZlXeBqYJenkgkOe00LbxnQddsbGdD4HSIuy5kfEN8dTIQ+D75B0KrCZlIC9FWe8C1iRnfgIgKSTSAuy/hgRLzWptwc4CfgM9UPTn2uhbWO6DjtjYzqciAhJ1wObJU0D1pMc6xzgQ8DfI+L2/FephcBW4EngDNLT9FOkOeFW+A5wFfCgpK8BR4HrgHnAklF0fVDSQ8AaSWeQ5sWvBM5rVseYXsBzxsZ0ARGxleRoZwD3AMPAbaRh4z252P58/lbgl8BdpL9ILYqIV1ps7ynSqug/A3cDG0jzyEsi4hdjVP806QfBrcBPSA8FN7TSvjHdhiLGDBtrjDHGmEnET8bGGGNMydgZG2OMMSVjZ2yMMcaUjJ2xMcYYUzJ2xsYYY0zJ2BkbY4wxJWNnbIwxxpSMnbExxhhTMv8FMg2+cqdWVicAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用matplotlib 绘制精度和召回相对于阀值的函数图\n",
    "def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):\n",
    "    plt.plot(thresholds, precisions[:-1], \"b--\", label=\"Precision\", linewidth=2)\n",
    "    plt.plot(thresholds, recalls[:-1], \"g-\", label=\"Recall\", linewidth=2)\n",
    "    plt.xlabel(\"Threshold\", fontsize=16)\n",
    "    plt.legend(loc=\"upper left\", fontsize=16)\n",
    "    plt.ylim([0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "plot_precision_recall_vs_threshold(precisions, recalls, thresholds)\n",
    "plt.xlim([-700000, 700000])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_precision_vs_recall(precisions, recalls):\n",
    "    plt.plot(recalls, precisions, \"b-\", linewidth=2)\n",
    "    plt.xlabel(\"召回\", fontsize=16)\n",
    "    plt.ylabel(\"精度\", fontsize=16)\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_precision_vs_recall(precisions, recalls)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 通过选择阀值来实现最佳的精度/选择最佳召回率权衡"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 目标设定为90%的精度，阀值大概在30000左右 , 设置了阀值为30000\n",
    "y_train_pred_90 = (y_scores > 30000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8705020469726352"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "precision_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7452499538830474"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 总结\n",
    "* 获得了一个90%精度的分类器，但如果召回太低，精度再高，也不怎么有用\n",
    "* 如果工作中，需要99%的精度，你应该回应，召回率是多少？"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ROC曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "\n",
    "fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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rbc46qijSEpKcrosERGJIq7o3m/o6/RfeOEFjj/+eO69914AunbtqsAXEZGIc0XoN1TFxcWMHz+e4cOH06VLFy666CKnSxIRkSjmjtBvgA39L7/8kpycHGbOnMktt9zC4sWLOeKII5wuS0REopjG9OtJaWkpJSUlLFy4kH79+jldjoiIiDta+g2lob99+3ZmzpwJQM+ePVm1apUCX0REGgxXhH5D8P7779O9e3euvPJK1q5dC0BcXJyzRYmIiOzBFaFvHFyo7/P5mDx5MmeccQaJiYl88sknGrsXEZEGSWP6h8Bay+9//3vefPNNRo8ezaOPPkpKSorTZYmIiFTLFaHvVDvfGMNFF13EiBEjGD16tENViIiIhMcVoR9JZWVlXH/99WRnZzNu3DhGjRrldEkiIiJhccmYfmReZ+XKlfTq1YtHHnmEH374ITIvKiIiUkfU0g+DtZZnnnmGa665hqSkJF5//XXOOussp8sSERGpFbX0w5Cbm8ull15Kr169yMvLU+CLiEijpJb+AWzdupWMjAxOPPFE5s+fz4ABA/B6vU6XJSIiclDc0dKv4/n7gUCAf/zjHxxxxBEsW7YMgMGDByvwRUSkUVNLfy+bN29mzJgxLFiwgPPPP5+jjz7a6ZJERETqhDta+nXU0F+wYAFZWVm8//77PPHEE7z00kukp6fXzclFREQcppb+Hj755BNatGjBokWL6NKli9PliIiI1ClXtPQPxerVq/noo48AmDhxIsuWLVPgi4iIK0V16M+dO5fu3bszfvx4/H4/Xq+XxMREp8sSERGpF64I/dpeZa+4uJhLLrmEiy66iK5duzJ//nzNzBcREdeLujH9rVu3ctppp/H9998zceJEbr/9dmJiou5tEBGRKOSKtKtNO79FixacccYZPP7445xxxhn1VpOIiEhD44ru/Zps376dkSNHsnr1aowxCnwREYlKrgj9Aw3pL168mKysLF566aXdu+uJiIhEI1eEfnV8Ph+TJ0+mX79+JCUl8emnnzJs2DCnyxIREXGMK0K/ur33p02bxh133MGoUaNYvnw52dnZDlQmIiLScLhiIt+eioqKaNKkCX/605846qijOP/8850uSUREpEFwR0vfQFlZGVdffTU9e/akuLiY5ORkBb6IiMgeIh76xpgZxphPjDETD+WYPf20ehW9evXi0UcfZciQIVp3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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_roc_curve(fpr, tpr, label=None):\n",
    "    plt.plot(fpr, tpr, linewidth=2, label=label)\n",
    "    plt.plot([0, 1], [0, 1], 'k--')\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "    plt.xlabel('假正类率', fontsize=16)\n",
    "    plt.ylabel('真正类率', fontsize=16)\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_roc_curve(fpr, tpr)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.965605769066425"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算曲线下面积AUC，虚线是随机分类0.5到1\n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "roc_auc_score(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 召回率TPR越高，分类器的假正类FPR就越多\n",
    "* 虚线表示纯随机分类器的ROC曲线，好的分类器应该远离这条线，向左上角\n",
    "* 是使用精度/召回率 PR曲线，还是使用ROC，关键在于 正类非常少或者更关注假正类而不是假负类，选择PR，反之ROC\n",
    "* 例如：前面例子ROC曲线很不错是因为跟负类 非5 相比， 正类 数据5 数量真的很少"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练随机森林分类器，比较SGD分类器的ROC曲线和ROC AUC分数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 获取训练集中每个实例的分数\n",
    "* RandomForestClassifier 没有descision_function(),但是拥有dict_proda()方法，sklearn中分类器都有这两个中的一个\n",
    "* dict_proda返回一个矩阵，每行一个实例，每列代表一个类别的概率，比如这个图片 70%是5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "forest_clf = RandomForestClassifier(n_estimators=10, random_state=42)\n",
    "y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3,\n",
    "                                    method=\"predict_proba\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1. , 0. ],\n",
       "       [1. , 0. ],\n",
       "       [1. , 0. ],\n",
       "       ...,\n",
       "       [1. , 0. ],\n",
       "       [0.5, 0.5],\n",
       "       [1. , 0. ]])"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_probas_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 绘制ROC曲线，需要决策值不是概率，直接使用正类的概率作为决策值：\n",
    "y_scores_forest = y_probas_forest[:, 1] \n",
    "fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5,y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0. , 0. , 0. , ..., 0. , 0.5, 0. ])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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rBnffPMN4Hr/J676VrZsWerXr5/t/sqVKwfAX3/9lX+hJd/4oujHxHqdIP+lpKQwevRo2rdvT1hYGC+99JKuJRYJIGPcV2bdu7u2Tz7JaJs0ybUNHpzRtn27azvxztVNm7r22EzvYaNGubZRozLaYs/yPS4yMpL169fz6quvsn37dtq3b8+cOXNISkoiKMiVgeXLl2OMOfaVHb3vFG6+KPp79nidIH/t2rWLDh06MHLkSG666SZWrVpF06ZNvY4lIoVIaGgod9xxB9999x1169ZlyJAhhIeHk5CQALhh+9WrVzN58uRT7mffvn0AlClTJt8zS97zRdH3e/0LDw/n0KFDTJ8+nTfffJOIiAivI4kUOda6r8w++cS1pU18B1wP31rX409Xvbpr2779+OfHxrr2zO9ho0a5tsw9/bN5j5s8eTJdunQ59nPFihUZMWIE27Zto0KFCuzdu5f4+HhKlixJo0aNqFKlyin39/3333P++edrDZBCyhdFv2KFnLcpbI4cOcKYMWNISEggPDyc5cuX079/f69jiUghU7x4cRYsWHDcOfg9e/ZQokQJrr/+egA+yXR+Ii4uLtt9/fnnn3z88cdce+21+RdY8pUvLtnzm/Xr19OrVy/i4uKoXbs20dHRx867iYicju7du1OuXDluvPFGHn74YXbt2sXIkSMZPHgwDRo0oEePHtx1110ABAcHn3Tr7cTERFauXMnGjRsZM2YMERERPPLII168FMkDvqgkW7Z6nSBvWGuZMmUKTZs2Zdu2bfzvf/8jOjra61giUoiVLVuW+fPnk5qayvXXX8/w4cPp378/48aNA2DatGn/3969x0dVXQsc/y0gDwJcHgESQoXUBJECkqaSCLaaqMjDj0jVghIs4SFgAQtUoKXBBNC2qKX0Kor4iFetXKvcipaCPAqhVISAPMo1rfgxChcFAbFISAIh6/5xJsMkPDIJmRlysr6fz3ycmbPPOetsD1lz9tl7H370ox/xwAMPkJOTw8SJEyut/8UXX5CamsqUKVNISUlhy5YtNmKoHhOtepOqnono0EUnTt/IgmkdQh3KJZs3bx4PP/ww6enpvPrqq8RV7eprjAm4goICunXrFuowTANX3XkoIttV9dqabtcVzftXXBHqCC6NqiIiZGRkEB4ezkMPPUTjxo1DHZYxxhiXcUXz/tVXhzqC2ikvL+fxxx9n6NChqCpXXnklM2fOtIRvjDEmIFyR9OujQ4cOMWjQIGbMmEF5eTklJSWhDskYY4zLuSLpF9ezfLl69Wp69epFXl4eixcv5s0336Rp06ahDssYY4zLuSLpv/f3UEfgv5MnT5KZmUl0dDT5+fmMHz/eprU0xhgTFK7oyBdZDy6S9+/fT1xcHFFRUbz77rskJCTYjFbGGGOCyhVX+tf3DXUEF/f666/To0cP77jYnj17WsI3xhgTdK5I+peroqIixo4dyz333EP37t0ZPnx4qEMyxhjTgFnSD5B//OMfXHvttbz44ovMmjWLvLw84uPjQx2WMcaYBswVSX/r1lBHcK7i4mJOnjzJ2rVrefTRRwkLCwt1SMaYBuall15CRBARGjVqROfOnXnooYe8j9MN1D6DdYHz6aefeo+v6uull14KSgz1jSs68gXw/K2Ro0ePsnz5ckaPHk1KSgp79+4lPDw81GEZYxq4/Px8Tp06xdatW5k9ezaHDh3ilVdeCXVYdWbx4sV8r8rzh7/97W+HKJpz7dy5kw0bNjBlypRQh+KOpN87JdQRwMaNG8nIyODLL7/kpptuIj4+3hK+MeaycO21zhTtffv2paioiLlz5/L8888TERER4sjqRteuXb3HeDnauXMnCxcuvCySviua95s3C92+y8rKyMnJIT09naZNm7J582a7d2+MuWwlJydz6tQpjh49GupQTAi4IumHiqoyePBg5syZQ0ZGBtu3byc5OTnUYRljzAUdOnQIESE6OhqAAwcOMGTIEFq2bElsbCxTp06lvLwcOHvPfOfOndx99900b96cq6++ms2bN3u39+GHH3L99dcTGRlJnz59KCwsrLS/Y8eOMWLECJo3b05sbCxz5syh4umuaWlpjB8/nt69e9OmTRtWrFhBnz59aNWqFW+99VadHG9paSmTJ0+mTZs2tG7dmsmTJ1NaWupdvmHDBkSEM2fOMG/ePOLj4yvd+jh9+jQzZ84kJiaG6OhoMjMzOX78uHf58ePHGTlyJO3ataNVq1bceeedHD58GICcnBxEhFGjRvHZZ595+xvk5OTUybHViqrW61d4bKI+tfxzDZVXXnlFX3755ZDt3xhTtz788MNQh1BncnNz1fkz79izZ4927dpVb7nlFu93N954o/bo0UPXrl2rb775prZp00Zzc3NVVbWwsFAB7dGjh06a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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 6))\n",
    "plt.plot(fpr, tpr, \"b:\", linewidth=2, label=\"SGD\")\n",
    "plot_roc_curve(fpr_forest, tpr_forest, \"Random Forest\")\n",
    "plt.legend(loc=\"lower right\", fontsize=16)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9927768831871406"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Rand 比SGD 好很多，ROC AUC的分数也高很多\n",
    "roc_auc_score(y_train_5, y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9862314012880302"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 再看一下 精度和召回率 也很高\n",
    "y_train_pred_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3)\n",
    "precision_score(y_train_5, y_train_pred_forest)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8192215458402509"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 总结\n",
    "* 选择合适的指标利用交叉验证来对分类器进行评估\n",
    "* 选择满足需求的精度/召回率权衡\n",
    "* 使用ROC曲线和ROC AUC分数比较多个模型\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多类别分类器\n",
    "* 尝试5 之外的检测\n",
    "* 多类别分类器 区分两个以上的类别\n",
    "* 随机森里和朴素贝叶斯可以直接处理多个类别\n",
    "* 支持向量机svm和线性分类器只可以处理二元分类器"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 解决方案\n",
    "1. 将数字图片分类0到9，训练10个二元分类器，每个数字一个，检测一张图片时，获取每个分类器的决策分数，哪个最高属于哪个，称为一对多OvA\n",
    "2. 为每一对数字训练一个二元分类器，区分0，1 区分0，2 区分1，2 称为一对一OvO策略，存在N个类别，需要N*（N-1）/2个分类器，最后看哪个类别获胜最多\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 优缺点\n",
    "* OvO 只需要用到部分训练集对其必须区分两个类别进行训练\n",
    "* 对于较小训练集合OvO比较有优势， 大训练集合 OvA 速度快，所以OvA更常用，比如svm 在数据规模扩大时表现糟糕\n",
    "* sklearn 检查到使用二元分类算法进行多类别分类任务，会自动运行OvA，SVM分类器除外"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5], dtype=int8)"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.fit(X_train, y_train)\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-307228.80530637, -597711.18522246, -296778.14248884,\n",
       "        -170071.74430147, -264031.47422934,  249325.04905087,\n",
       "        -842071.03581207, -257706.39548631, -984811.8647335 ,\n",
       "        -655580.15334357]])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 内部实际上训练了10个二元分类器，获得图片的决策分数，然后选择了分数最高的类别\n",
    "# 返回10个分数，每个类别1个\n",
    "some_digit_scores = sgd_clf.decision_function([some_digit])\n",
    "some_digit_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.argmax(some_digit_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int8)"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 目标类别列表会存储在classes_这个属性中，按值大小排列，\n",
    "sgd_clf.classes_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.classes_[np.argmax(some_digit_scores)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5], dtype=int8)"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用OvO策略，一对一或者一对多\n",
    "from sklearn.multiclass import OneVsOneClassifier\n",
    "ovo_clf = OneVsOneClassifier(SGDClassifier(max_iter=5, tol=-np.infty, random_state=42))\n",
    "ovo_clf.fit(X_train, y_train)\n",
    "ovo_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ovo_clf.estimators_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5], dtype=int8)"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用随机森林\n",
    "forest_clf.fit(X_train, y_train)\n",
    "forest_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0. , 0. , 0.1, 0. , 0. , 0.9, 0. , 0. , 0. , 0. ]])"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 随机森林直接将实例分为多个类别，调用predict_proba()可以获得分类器将每个实例分类为每个类别的概率列表\n",
    "forest_clf.predict_proba([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.8605 , 0.84545, 0.8592 ])"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用交叉验证评估SGD的准确率\n",
    "cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.9106 , 0.9102 , 0.90785])"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将输入进行简单缩放 ，可以得到准确率 90 %以上\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n",
    "cross_val_score(sgd_clf, X_train_scaled, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 错误分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 项目流程\n",
    "1. 探索数据准备的选项\n",
    "2. 尝试多个模型\n",
    "3. 选择最佳模型并用GridSearchCV对参数进行微调\n",
    "4. 尽可能自动化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 确定了一个相对合适的模型，进一步优化，分析其错误类型\n",
    "* 查看混淆矩阵\n",
    "* 使用cross_val_predict()进行预测\n",
    "* 调用confusion_matrix()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5728,    4,   18,    9,   11,   50,   49,    7,   43,    4],\n",
       "       [   2, 6486,   42,   26,    6,   39,    7,    9,  112,   13],\n",
       "       [  63,   38, 5300,  113,   84,   23,  106,   52,  161,   18],\n",
       "       [  43,   47,  130, 5366,    3,  223,   38,   49,  132,  100],\n",
       "       [  21,   27,   36,    7, 5335,    9,   56,   29,   88,  234],\n",
       "       [  68,   45,   30,  180,   76, 4607,  115,   24,  176,  100],\n",
       "       [  36,   23,   39,    2,   37,   83, 5634,    8,   56,    0],\n",
       "       [  25,   24,   71,   34,   50,   10,    4, 5779,   15,  253],\n",
       "       [  50,  160,   67,  166,   14,  147,   60,   24, 5017,  146],\n",
       "       [  37,   36,   29,   88,  143,   34,    3,  182,   76, 5321]],\n",
       "      dtype=int64)"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3)\n",
    "conf_mx = confusion_matrix(y_train, y_train_pred)\n",
    "conf_mx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用matplotlib的matshow 函数来查看混淆矩阵的图像表示\n",
    "plt.matshow(conf_mx, cmap = plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 看起来不错，大多数图片都在主对角线上，说明它们被正确分类\n",
    "# 数字5 看起来比较暗，说明1. 数字5图片较少  2. 分类器在数字5上执行效果不如其他数字上好\n",
    "# 假设把焦点放在错误上，为取得错误率，而不是错误绝对值，需要将混淆矩阵中每个值除以相应类别中的图片数量\n",
    "\n",
    "row_sums = conf_mx.sum(axis=1, keepdims=True)\n",
    "norm_conf_mx = conf_mx / row_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 用0填充对角线 只保留错误，重新绘制\n",
    "np.fill_diagonal(norm_conf_mx, 0)\n",
    "plt.matshow(norm_conf_mx, cmap=plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 每行代表实际类别，每列代表预测类别\n",
    "# 8，9列比较亮，说明许多图片被错误的分类为数字8，9\n",
    "# 类别8，9行也偏亮，说明数字8和9经常会跟其他数字混淆\n",
    "# 有些很暗，比如行1，大多数数字1都被正确的分类，一些和8混淆\n",
    "# 5和3是错误最多的"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 结论\n",
    "* 改进数字8和9的分类\n",
    "* 修正数字3和5的混淆"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 如何优化分类器\n",
    "* 尝试多收集这些数字的训练集\n",
    "* 开发一些新特征来改进分类器\n",
    "* 优化分类器算法\n",
    "* 使用pillow或opencv对图片预处理，让显示模型更突出\n",
    "* 分析单个错误"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_digits(instances, images_per_row=10, **options):\n",
    "    size = 28\n",
    "    images_per_row = min(len(instances), images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances]\n",
    "    n_rows = (len(instances) - 1) // images_per_row + 1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size, size * n_empty)))\n",
    "    for row in range(n_rows):\n",
    "        rimages = images[row * images_per_row : (row + 1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages, axis=1))\n",
    "    image = np.concatenate(row_images, axis=0)\n",
    "    plt.imshow(image, cmap = matplotlib.cm.binary, **options)\n",
    "    plt.axis(\"off\")\n",
    "\n",
    "\n",
    "# 查看数字3和数字5的例子\n",
    "cl_a, cl_b = 3, 5\n",
    "X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)]\n",
    "X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)]\n",
    "X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)]\n",
    "X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)]\n",
    "\n",
    "plt.figure(figsize=(8,8))\n",
    "plt.subplot(221); \n",
    "plot_digits(X_aa[:25], images_per_row=5)\n",
    "plt.subplot(222); \n",
    "plot_digits(X_ab[:25], images_per_row=5)\n",
    "plt.subplot(223);\n",
    "plot_digits(X_ba[:25], images_per_row=5)\n",
    "plt.subplot(224); \n",
    "plot_digits(X_bb[:25], images_per_row=5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 左侧两个是被分类为3的图片\n",
    "# 右侧两个是被分类为5的图片\n",
    "# 大多数错误分类的图片看起来还是非常明显的错误\n",
    "# 原因：SGD是一个线性模型，它所做就是为每个像素分配一个各个类别的权重，当它看到新的图像，将加权后的像素强度汇总，从而得到一个分数进行分类\n",
    "# 数字3和5在一部分像素位上有区别，所以分类器很容易将其弄混\n",
    "# 通过上面图像，如果书写3 的连接点左移，分类器可能将其分类为数字5，这个分类器对图像位移和旋转敏感\n",
    "# 减少混淆的方法之一，就是对图像进行预处理，确保位于中心位置并且没有旋转"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多标签分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 为每个实例产生多个类别 ，例如 照片识别多个人脸\n",
    "# 分类器经过训练可以识别小红，小白，小军，一张照片 里有 小红，小白\n",
    "# 经过分类器，应该输出[1,1,0]， 是小红，是小白，不是小军\n",
    "# 输出多个二元标签的分类系统称为多标签分类系统"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "                     metric_params=None, n_jobs=None, n_neighbors=5, p=2,\n",
       "                     weights='uniform')"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "y_train_large = (y_train >= 7)\n",
    "y_train_odd = (y_train % 2 == 1)\n",
    "y_multilabel = np.c_[y_train_large, y_train_odd]\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train, y_multilabel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False,  True]])"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# knn支持多标签分类，不是所有的分类器都支持\n",
    "knn_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "# # 评估多标签分类器方法很多，方法之一就是测量每个标签的F1分数，或者其他二元分类器指标，然后简单平均\n",
    "#y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_multilabel, cv=3)\n",
    "#f1_score(y_multilabel, y_train_knn_pred, average=\"macro\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 上面假设了所有标签都同等重要，也可以给每个标签设置一个权重（该目标标签实例的数量），设置average='weighted'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 增加噪声，目标将图片还原为原始图片 创建训练集和测试集\n",
    "noise = np.random.randint(0, 100, (len(X_train), 784))\n",
    "X_train_mod = X_train + noise\n",
    "noise = np.random.randint(0, 100, (len(X_test), 784))\n",
    "X_test_mod = X_test + noise\n",
    "y_train_mod = X_train\n",
    "y_test_mod = X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "some_index = 5500\n",
    "plt.subplot(121);plt.imshow(X_test_mod[some_index].reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.subplot(122);plt.imshow(y_test_mod[some_index].reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn_clf.fit(X_train_mod, y_train_mod)\n",
    "clean_digit = knn_clf.predict([X_test_mod[some_index]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(clean_digit.reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 作业二"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy\n",
    "from sklearn.neighbors import KNeighborsClassifier as kNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "                     metric_params=None, n_jobs=1, n_neighbors=3, p=2,\n",
       "                     weights='distance')"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "neigh = kNN(n_neighbors=3, algorithm='auto', weights='distance', n_jobs=1)\n",
    "neigh.fit(X_train, y_train_5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_knn_pred = cross_val_predict(neigh, X_train, y_train_5, cv=3)#我想模仿老师的代码测一下精度，但是计算机就是算不出来，不知道为什么"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
